home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Software Contest 3
/
FM Towns Software Contest 3.iso
/
exp
/
astral
/
a1
/
game
/
source
/
line.asm
< prev
next >
Wrap
Assembly Source File
|
1994-01-07
|
3KB
|
127 lines
.386p
;----------------------------------------------------------------------------
; void pset(int x,int y,int color,int page)
;----------------------------------------------------------------------------
code segment
assume cs:code
public pset
db 'pset',4
pset proc near
push ds
mov dx,120h
mov ds,dx
mov cx,ss:[esp]+4+12
mov eax,ss:[esp]+4+16
shl eax,16
mov al,ss:[esp]+4+4 ;x1を読み込む
mov ah,ss:[esp]+4+8 ;y1 〃
lea edx,[eax*2]
mov ds:[edx],cx
pop ds
ret
pset endp
; ラインルーチン本体
;void line(int x1,int y1,int x2,int y2,int col,int page);
; for 256*512*32K colors (GRAPHIC MODE 5) only
public line ;このへんはおまじないと思ってください
db 'line',4 ;for stackdump
line proc near
push ebp
push esi
push edi
push ebx
mov bp,ss:[esp+20+16] ;色を読み込む
mov edi,ss:[esp+20+20] ;ページを読み込む
shl edi,17
mov bh,ss:[esp+20+0] ;x1を読み込む
mov bl,ss:[esp+20+4] ;y1 〃
mov ch,ss:[esp+20+8] ;x2 〃
mov cl,ss:[esp+20+12] ;y2 〃
mov dh,bl
mov dl,bh
movzx edx,dx
lea esi,[edi+edx*2] ;(x1,y1)のアドレス
;を求める
push ds ;dsをVRAMのセレクタに
mov dx,120h ;にする
mov ds,dx
mov edx,2 ;edxが横方向の増加量
sub ch,bh
jnb short #liney ;xが増える方向に線を引く?
neg edx ;減る方向だとedxをマイナスにする
neg ch
#liney: mov edi,512 ;ediが縦方向の増加量
sub cl,bl
jnb short #liner ;yが増える方向に線を引く?
neg edi ;減る方向だとediをマイナスにする
neg cl
#liner: cmp ch,cl ;xとyのどちらの変化量が
je short #lines ;大きいか調べて,chが
ja short #lineg ;大きいようにする
xchg ch,cl ;同じ時はlinesに飛ぶ
xchg edi,edx ;縦横の変化量も取り替える
#lineg: mov ah,cl ;割り算をして,
mov al,0 ;傾きを求める。
div ch
mov ah,128
movzx cx,ch ;ループカウンタに
movzx ecx,cx ;横方向のドット数を
inc cx ;いれる。
align 4
#lineg1:
mov ds:[esi],bp ;1ドット点をかく
add esi,edx ;横に座標を動かす
add ah,al ;傾きを足す
jnb short #lineg2 ;あふれたら縦に
add esi,edi ;点を動かす
#lineg2:
loop #lineg1 ;ループ
jmp #exit
align 4
#lines: movzx cx,ch ;ループカウンタに
movzx ecx,cx ;横方向のドット数を
inc cx ;いれる
align 4
#lines1: ;傾きが1のときの
mov ds:[esi],bp ;ルーチン
add esi,edx ;縦横に1回ずつ
add esi,edi ;動かしてドットをかく
loop #lines1
#exit:
pop ds ;スタックを元に
pop ebx ;戻す
pop edi
pop esi
pop ebp
ret
line endp
code ends
end